/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package server.negocio;

import cliente.comunicacion.ICliente;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;


import server.dominio.ISesion;

import java.util.Hashtable;
import java.rmi.RemoteException;
import java.util.Enumeration;

import server.comunicacion.ServidorA;
import server.comunicacion.proxyServA;
import server.dominio.Sesion;
import server.excepciones.UsuarioIncorrectoException;
import server.presentacion.JF_Servidor;
import server.presentacion.iJF_Servidor;


/**
 *
 * @author tpaxle
 */
public class Controlador_Servidor {
     private Hashtable<String, ISesion> tablalogins;
     private Hashtable<Long, ICliente> tablasesiones;
     private ServidorA servidor;
     private iJF_Servidor ventana;
     private proxyServA proxyServidorb;
     private Fachada_Servidor fachada_basedats;

     public Controlador_Servidor(ServidorA servidor, iJF_Servidor ventanav) {
         tablalogins= new Hashtable<String, ISesion>();
         tablasesiones= new Hashtable<Long, ICliente>();
         this.servidor= servidor;
         ventana= ventanav;
         boolean ok= false;
        try {
            proxyServidorb = proxyServA.getProxy();
            ok= true;
        } catch (MalformedURLException ex) {
            this.log("Error al conectarse Con el servidor de Respaldo: "+ ex.toString());
        } catch (RemoteException ex) {
            this.log("Error al conectarse Con el servidor de Respaldo: "+ ex.toString());
        } catch (NotBoundException ex) {
            this.log("Error al conectarse Con el servidor de Respaldo: "+ ex.toString());
        } finally{
            if(!ok)                
                System.exit(1);
        }
    }



     public void registrar(long idSesion, ICliente cliente){
         //Se Registra el usuario
         ventana.escribir("el Cliente con idSesion: " + idSesion  + "se ha registrado");
          tablasesiones.put(idSesion, cliente);
     }


     private void desconectar(long idSesion){
         //aki se procede a mandar el mensaje de salida al ICliente
     }




    public boolean comprobarUsuario(int tipo, long idSesion) throws UsuarioIncorrectoException{
        //Buscar en la tabla logins algun login con idsesion= idsesion y ver su rol
        Enumeration<String> claves= tablalogins.keys();
        boolean retorno= false;
        ISesion sesionaux= null;
        while(claves.hasMoreElements()){
            String clave= claves.nextElement();
            if(tablalogins.get(clave).getId()== idSesion){
                sesionaux= tablalogins.get(clave);
                retorno= true;
            }
        }

     /*   if(tablasesiones.contains(idSesion) && sesionaux!= null && (int)sesionaux.getRol() == tipo){
            //Si el usuario con ese idSesion está autenticado Saber que contiene el ICLIENTE y comprobar dni es administrar
        }else{
           ventana.escribir("La idSesion introducida no es válida o la sesion creada no esta asociada a un usuario con dicho rol("+tipo+")");
           throw new UsuarioIncorrectoException("El usuario con idSesion no está autenticado");
        }*/
        return retorno;
    }

    public boolean existelogin(String login) {
        return tablalogins.get(login)!= null;
    }

    public void eliminarlogin(String cadena_login) {
        //Se expulsa de la sesion en primer lugar
        ISesion sesion= tablalogins.get(cadena_login);
        //Obtenemos el ICLIENTE
        ICliente cliente= tablasesiones.get(sesion.getId());
        //Eliminamos al usuario inciiado
        tablalogins.remove(cadena_login);
        this.eliminarsesionlogin(cadena_login);
        try {
            //Se manda mensaje al usuario pa ke termine su sesion
            cliente.expulsar();
        } catch (RemoteException ex) {
            ventana.escribir("Mensaje de finalizacion no entregada al cliente: \n"+ cadena_login);
        } finally {
            tablasesiones.remove(sesion.getId());
            ventana.escribir("IdSesion del usuario: "+ cadena_login + ", modificado");
        }
    }



    public boolean comprobaridSesion(long idSesion) {
        return tablasesiones.contains(idSesion);
    }

    public void insertarusuario(String login, Sesion sesionaux) {
        tablalogins.put(login, sesionaux);
    }

    public ICliente getCliente(long idSesion) {
        return tablasesiones.get(idSesion);
    }

    public void log(String mensaje) {
        ventana.escribir(mensaje);
    }

    public proxyServA getProxyServidorb() {
        return proxyServidorb;
    }

    public Hashtable<Long, ICliente> getTablasesiones() {
        return tablasesiones;
    }

    public void eliminarsesion(long idSesion) {
        Enumeration<String> claves= tablalogins.keys();
        while(claves.hasMoreElements()){
            String clave= claves.nextElement();
            if(tablalogins.get(clave).getId()== idSesion)
                tablalogins.remove(tablalogins.get(clave).getId());
        }
        tablasesiones.remove(idSesion);
        this.log("Sesion: "+ idSesion + ", ha sido eliminada ya que no existe conexion o ha abandonado la sesion");
    }

    private void eliminarsesionlogin(String cadena_login) {
        long idsesion= tablalogins.get(cadena_login).getId();

        tablasesiones.remove(idsesion);
    }

    public int getipousuario(long idSesion) {
        int resultado= -1;
        Enumeration<String> claves= tablalogins.keys();
        while(claves.hasMoreElements()){
            String clave= claves.nextElement();
            if(tablalogins.get(clave).getId()== idSesion)
                resultado= (int) tablalogins.get(clave).getRol();
        }
        return resultado;
    }

    public String getlogin(long idSesion) {
        Enumeration<String> claves= tablalogins.keys();
        String login= "";
        while(claves.hasMoreElements()){
            String clave= claves.nextElement();
            if(tablalogins.get(clave).getId()== idSesion){
                login= clave;
                break;
            }
        }
        return login;
    }

    
    
}




